/*
 * TijeraFisica.cpp
 *
 *  Created on: Nov 7, 2013
 *      Author: Hernan
 */

#include "TijeraFisica.h"
#include <iostream>

using namespace std;

TijeraFisica::TijeraFisica(b2World* world, float x, float y,float ancho, float alto, float angulo, string tipo) :  EntidadFisica(tipo) {

	//hay que crear un cuadradito fijo para q el balancin rote sobre el
	b2BodyDef* defBodyCuadradito = new b2BodyDef();
	defBodyCuadradito->angle = angulo;
	defBodyCuadradito->position.Set(x, y - 3/8*alto);
//	b2Body* cuadradito1 = world->CreateBody(defBodyCuadradito);

	b2PolygonShape formaCuadradito;
	formaCuadradito.SetAsBox(0.5f, 0.5f);
	b2FixtureDef* fixtureCuadradito = new b2FixtureDef();
	fixtureCuadradito->density = 0.0f;
	fixtureCuadradito->shape = &formaCuadradito;

//	cuadradito1->CreateFixture(fixtureCuadradito);

	b2PolygonShape box;
	box.SetAsBox(ancho/2, alto/16);

	this->fixture = new b2FixtureDef();
	this->fixture->shape = &box;

	this->fixture->density = 10.4f;
/*
	this->definicionCuerpoFisico->position.Set(x, y - 3/8*alto);
	this->definicionCuerpoFisico->angle = 0.0f*b2_pi/180.0f ;
	this->definicionCuerpoFisico->type = b2_dynamicBody;
	this->cuerpoFisico2 = world->CreateBody(definicionCuerpoFisico);
	this->cuerpoFisico2->CreateFixture(this->fixture);

	b2RevoluteJointDef jd2;
	jd2.Initialize(this->cuerpoFisico2, cuadradito1, cuadradito1->GetWorldCenter());
	jd2.lowerAngle =  -45.0f * b2_pi / 180.0f;
	jd2.upperAngle = 0.0f * b2_pi / 180.0f;
	jd2.enableLimit = true;
	this->joint2 = (b2RevoluteJoint*) world->CreateJoint(&jd2);


	double desplazamientoX2 = -ancho/2;
	double desplazamientoY2 = 0;
	*/
//	double anguloRot2 = 0.0f*b2_pi/180;
/*
	double desplazamRotadoX2 = desplazamientoX2 * cos(anguloRot2) - desplazamientoY2*sin(anguloRot2);
	double desplazamRotadoY2 = desplazamientoX2 * sin(anguloRot2) + desplazamientoY2*cos(anguloRot2);

	double x2 = desplazamRotadoX2 + x;
	double y2 = desplazamRotadoY2 + y - 3/8*alto;
*/
	b2PolygonShape caja;
	caja.SetAsBox(0.5f, 0.5f);


	// definicion de filo derecho :

	defBodyCuadradito->position.Set(x, y + 3/8*alto);
	b2Body* cuadradito2 = world->CreateBody(defBodyCuadradito);

	cuadradito2->CreateFixture(fixtureCuadradito);

	b2RevoluteJointDef jd;

	this->definicionCuerpoFisico->position.Set(x, y + 3/8*alto);
	this->definicionCuerpoFisico->angle = 0.0f*b2_pi/180.0f ;
	this->definicionCuerpoFisico->type = b2_dynamicBody;
	this->cuerpoFisico = world->CreateBody(definicionCuerpoFisico);
	this->cuerpoFisico->CreateFixture(this->fixture);

	jd.Initialize(this->cuerpoFisico, cuadradito2, cuadradito2->GetWorldCenter());
	jd.lowerAngle = -30.0f * b2_pi / 180.0f;
	jd.upperAngle = 30.0f * b2_pi / 180.0f;
	jd.enableLimit = true;
	this->joint1 = (b2RevoluteJoint*) world->CreateJoint(&jd);

	double desplazamientoX1 = -ancho/2;
	double desplazamientoY1 = 0;

	double x1 = -desplazamientoX1 + x ;
	double y1 = desplazamientoY1 + y ;


	b2BodyDef* defderecho = new b2BodyDef();
	defderecho->type = b2_dynamicBody;
	defderecho->position.Set(x1, y1);
	this->extremoder =  world->CreateBody(defderecho);
	this->extremoder->CreateFixture(&caja,0.0f);

	b2RevoluteJointDef* jointDerDef1 = new b2RevoluteJointDef();
	jointDerDef1->Initialize(this->cuerpoFisico,extremoder,  extremoder->GetPosition());
	world->CreateJoint(jointDerDef1);

	double x2 = desplazamientoX1 + x ;
	double y2 = desplazamientoY1 + y ;


	b2BodyDef* defizquierdo = new b2BodyDef();
	defizquierdo->type = b2_dynamicBody;
	defizquierdo->position.Set(x2, y2);
	this->extremoizq =  world->CreateBody(defizquierdo);
	this->extremoizq->CreateFixture(&caja,0.0f);

	b2RevoluteJointDef* jointDerDef2 = new b2RevoluteJointDef();
	jointDerDef2->Initialize(this->cuerpoFisico,extremoizq,  extremoizq->GetPosition());
	world->CreateJoint(jointDerDef2);


	this->guardarInformacionDeEntidad();
	this->alto = alto;
	this->ancho = ancho;
}

TijeraFisica::~TijeraFisica() {
/*	cout<<"cuerpo: "<<this->cuerpoFisico2->GetPosition().x<<"; "<<this->cuerpoFisico2->GetPosition().y<<endl;
	cout<<"extr izqu: "<<this->extremoizq->GetPosition().x<<"; "<<this->extremoizq->GetPosition().y<<endl;*/

}

void TijeraFisica::aplicarFuerzasFisicas() {
	//cout<<"angulo filo1 : "<<this->cuerpoFisico2->GetAngle()*180/b2_pi<<endl;
	//cout<<"angulo filo2 : "<<this->cuerpoFisico->GetAngle()*180/b2_pi<<endl;

}

bool TijeraFisica::tijeraEstaCerrada(){
	cout<<"cuerpo fisico tijera: "<<this->cuerpoFisico->GetPosition().x<<"; "<<this->cuerpoFisico->GetPosition().y<<endl;
	cout<<"extre izq: "<<this->extremoizq->GetPosition().x<<"; "<<this->extremoizq->GetPosition().y<<endl;
	cout<<"extre der: "<<this->extremoder->GetPosition().x<<"; "<<this->extremoder->GetPosition().y<<endl;
	return  (cuerpoFisico->GetAngle()*180/b2_pi >=35.0f || cuerpoFisico->GetAngle()*180/b2_pi <-30.0f);
}

b2Body* TijeraFisica::obtenerFilo1(){
	return this->cuerpoFisico2;
}

b2Body* TijeraFisica::obtenerFilo2(){
	return this->cuerpoFisico3;
}
